import { createAlova } from "alova";
import vueHook from "alova/vue";
import AdapterUniapp from "@alova/adapter-uniapp";
import env from "@utils/envHelper.js";
import { handleUnauthorizedAccess } from "@utils/authGuard.js";

// 创建 alova 实例
const alovaInstance = createAlova({
  baseURL: env.getApiBaseUrl(),
  ...AdapterUniapp(),
  // Vue 3 状态钩子
  statesHook: vueHook,
  // 请求拦截器
  beforeRequest(method) {
    console.log("API请求:", method);
    // 设置默认 Content-Type
    method.config.headers = {
      ...method.config.headers,
      "Content-Type": "application/json",
    };
    // 添加认证 token（如果存在）
    const token = uni.getStorageSync("token");
    if (token) {
      method.config.headers = {
        ...method.config.headers,
        Authorization: `Bearer ${token}`,
      };
    }
    method.config.credentials = "include"; // 携带认证信息
    method.config.mode = "cors"; // 启用跨域模式
    // 设置超时时间
    method.config.timeout = 30000; // 30秒超时
    // 打印最终的请求头信息用于调试
    console.log("最终请求头:", method.config.headers);
  },

  // 响应拦截器
  responded: {
    // 成功响应处理
    onSuccess: async (response, method) => {
      const { statusCode, data } = response;
      // 开发环境下记录响应日志
      if (env.isDev()) {
        console.log("[Alova Response]", method.url, data);
      }
      // 处理不同的状态码
      if (statusCode === 200 || statusCode === 201) {
        // 成功响应直接返回数据
        if (data.code === 200) {
          return data;
        } else if (data.code === 401) {
          // 未授权，清除 token 并跳转到登录页
          uni.removeStorageSync("token");
          uni.removeStorageSync("userInfo");
          uni.showToast({
            title: "登录已过期，请重新登录",
            icon: "none",
          });
        } else {
          const errorMsg =
            data?.message || data?.msg || `请求失败，状态码: ${statusCode}`;
          uni.showToast({
            title: errorMsg,
            icon: "none",
          });
          throw new Error(errorMsg);
        }
      } else if (statusCode === 401) {
        // 未授权，清除 token 并跳转到登录页
        uni.removeStorageSync("token");
        uni.removeStorageSync("userInfo");
        uni.showToast({
          title: "登录已过期，请重新登录",
          icon: "none",
        });

        // 跳转到登录页
        uni.navigateTo({
          url: "/pages/login/index",
        });

        throw new Error("未授权访问");
      } else if (statusCode === 403) {
        uni.showToast({
          title: "权限不足",
          icon: "none",
        });
        throw new Error("权限不足");
      } else if (statusCode === 500) {
        uni.showToast({
          title: "服务器内部错误",
          icon: "none",
        });
        throw new Error("服务器内部错误");
      } else {
        // 其他错误
        const errorMsg =
          data?.message || data?.msg || `请求失败，状态码: ${statusCode}`;
        uni.showToast({
          title: errorMsg,
          icon: "none",
        });
        throw new Error(errorMsg);
      }
    },

    // 错误响应处理
    onError: (error, method) => {
      console.error("请求错误:", method.url, error);

      // 处理未授权访问
      if (handleUnauthorizedAccess(error)) {
        return;
      }

      // 网络错误处理
      if (error.message.includes("timeout")) {
        uni.showToast({
          title: "请求超时，请检查网络",
          icon: "none",
        });
      } else if (
        error.message.includes("Network Error") ||
        error.message.includes("ECONNREFUSED")
      ) {
        uni.showToast({
          title: "网络连接失败，请检查服务器",
          icon: "none",
        });
      } else if (error.message.includes("requestAdapter")) {
        uni.showToast({
          title: "请求适配器错误，请重启应用",
          icon: "none",
        });
      } else {
        uni.showToast({
          title: error.message || "请求失败",
          icon: "none",
        });
      }

      throw error;
    },
    // 请求超时时间（30秒）
    timeout: 30000,

    // 全局关闭缓存（设置为 null）
    cacheFor: {
      // 设置缓存模式为内存模式
      mode: 'memory',
      // 单位为毫秒
      // 当设置为`Infinity`，表示数据永不过期，设置为0或负数时表示不缓存
      expire: 10 * 1000
    }
  },
});

export default alovaInstance;
